package 递归;

/**
 * @PackageName: 递归
 * @ClassName: LeetCode70
 * @Author: chen jinxu
 * @Date: 2022/3/6 21:35
假设你正在爬楼梯。需要 n 阶你才能到达楼顶
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢
输入：n = 2
输出：2
输入：n = 3
输出：3
 n=4  1 1 1 1 / 2 2 / 1 1 2 / 2 1 1 /1 2 1/      ---5
 n=5 1 1 1 1 1 /2 2 1/ 1 2 2/2 1 2/1 1 2 1/ 2 1 1 1/ 1 1 1 2/ 1 2 1 1   -8
 */
public class LeetCode70 {
    public static void main(String[] args) {
        int n = 5;
        int i = climbStairs(n);
        System.out.println(i);
    }
    // 复杂度高的时候会超时，使用缓存
    public static int climbStairs1(int n) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        return climbStairs1(n - 1) + climbStairs1(n - 2);
    }
    public static int climbStairs(int n) {
        int[] memory = new int[n + 1];
        return climb(n, memory);
    }

    private static int climb(int n, int[] memory) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        if (memory[n] > 0) {
            return memory[n];
        }
        memory[n] = climb(n - 1, memory) + climb(n - 2, memory);
        return memory[n];
    }

}
